#pragma once
#include "Socket.h"
#include "EventLoop.h"
#include "Channel.h"
#include "InetAddress.h"
#include "Buffer.h"
class EventLoop;
class Connection
{

public:
    using func_t = std::function<void(Connection *)>;
    using func_t2 = std::function<void(Connection *, std::string&)>;

private:
    /* data */
    EventLoop *loop_;
    Socket *clientsock_;
    Channel *clientchannel_;
    Buffer inputbuffer_;  // 接受缓冲区
    Buffer outputbuffer_; // 发送缓冲区
    func_t closeCallBack_;
    func_t errorCallBack_;
    func_t2 messagecallback_;
    func_t sendcompletecallback_;

    

public:
    Connection(EventLoop *loop, Socket *clientsock);
    ~Connection();
    int fd() const;
    std::string getiP() const;
    uint16_t getport() const;
    void send(const char *data, size_t size); // 发送数据 
    void onmessage();
    void closecallback(); // TCP断开连接的回调函数 ，提供channel 回调
    void errorcallback(); // TcP连接错误的回调函数，提供Channel 回调
    void writeCallBack(); // 写事件的方法

    // 设置回调函数
    void setCloseCallBack(func_t func); // TCP断开连接的回调函数 ，提供channel 回调
    void setErrorCallBack(func_t func); // TcP连接错误的回调函数，提供Channel 回调
    void setsendcompletecallback(func_t func); // TcP连接错误的回调函数，提供Channel 回调
    // TcP连接错误的回调函数，提供Channel 回调

    void setonmessagecb(func_t2 fn); // 通信的
};
